#include <QPushButton>
#include <QTimer>
#include <QVBoxLayout>
#include <QProgressBar>
#include <botan/otp.h>
#include <data_display/totpitemwidget.h>

namespace data_display {

TOTPItemWidget::TOTPItemWidget(const totp::TOTP &totp, QWidget *parent): QWidget(parent), m_totp(totp) {
	// Создание основных компонентов
	auto *label = new QLabel(totp.label, this);
	passwordLabel = new ClickableLabel(this);
	passwordLabel->setText(QString::fromStdString(m_totp.generateOTP( "")));
	passwordLabel->setStyleSheet("QLabel { font-size: 18px; }");  // Устанавливаем размер шрифта

	progressBar = new QProgressBar(this);
	progressBar->setMaximum(totp.period);
	progressBar->setValue(totp.period);
	progressBar->setMinimumSize(50, 50);  // Устанавливаем размеры прогрессбара

	auto *deleteButton = new QPushButton("X", this);
	deleteButton->setStyleSheet("QPushButton { color: red; font-weight: bold; margin: 2px; }");
	connect(deleteButton, &QPushButton::clicked, this, &TOTPItemWidget::onDeleteClicked);

	// Создаем макет для метки и кнопки удаления
	auto *topLayout = new QHBoxLayout;
	topLayout->addWidget(label);
	topLayout->addStretch(1);  // Добавляем растягивающий элемент, чтобы кнопка была справа
	topLayout->addWidget(deleteButton);

	auto *mainLayout = new QVBoxLayout(this);
	mainLayout->addLayout(topLayout);  // Добавляем верхний макет
	mainLayout->addWidget(passwordLabel);  // Добавляем метку пароля под верхний макет
	mainLayout->addWidget(progressBar);  // Добавляем прогрессбар под метку пароля

	setLayout(mainLayout);

	// Создаем таймер для обновления кругового индикатора и пароля
	timer = new QTimer(this);
	connect(timer, &QTimer::timeout, this, &TOTPItemWidget::updateProgress);
	timer->start(1000); // Таймер обновления каждую секунду
}

totp::TOTP TOTPItemWidget::getTOTP() const {
	return m_totp;
}

void TOTPItemWidget::onDeleteClicked() {
	emit deleteRequested(m_totp);
}

void TOTPItemWidget::updateProgress() {
	// Уменьшаем значение кругового индикатора
	int remainingTime = m_totp.period - static_cast<int>(std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now() - m_totp.creation_time).count());
	progressBar->setValue(remainingTime);

	// При достижении 0, сбрасываем индикатор
	if (remainingTime == 0) {
		progressBar->setValue(m_totp.period);
	}

	// Обновляем пароль
	if(auto str = m_totp.generateOTP(passwordLabel->text().toStdString()); str != passwordLabel->text().toStdString()) {
		passwordLabel->setText(QString::fromStdString(str));
		progressBar->setValue(m_totp.period);
	}
}

QString TOTPItemWidget::getPasswrodLabel() {
	return passwordLabel->text();
}

void TOTPItemWidget::sendCopySignal() {
	emit passwordCopied(passwordLabel->text());
}
}
